const mysql = require('mysql');

const sql_option = {
    host: '39.97.242.107',
    user: 'xiangsu',
    password: '123112233',
    port: '3306',
    database: 'xiangsu',
    connectTimeout: 5000, // 链接超时时间
    multipleStatements: true // 是否允许一个query 包含多条sql语句
}

class Pool {
    constructor(){
        this.pool = mysql.createPool({
            ...sql_option,
            waitForconnections: true, // 当无链接池可用时，等待（true）还是抛错（false）
            connectionLimit: 100, // 链接数限制
            queueLimit: 0 // 最大链接等待数，0为不限制
        });
        this.pool.on('error', err => err.code === 'PROTOCOL_CONNECTION_LOST' && setTimeout(repool, 2000))
    
        // acquire 获取连接后，连接池会触发acquire事件。触发时间是在全部连接获取后，触发处理连接的回调前。
        this.pool.on('acquire', function(connection) {
            // console.log('Connection %d acquired', connection.threadId);
        });
        // connection 当一个新的连接在连接池里创建时，会触发connection事件。你可以通过监听connection事件来设置session相关的变量。
        this.pool.on('connection', function(connection) {
            // connection.query('SET SESSION auto_increment_increment=1')
        });
        //enqueue 如果回调已进入队列，等待可用连接，连接池会触发enqueue事件。
        this.pool.on('enqueue', function() {
            // console.log('Waiting for available connection slot');
        });
        // release 连接释放时，连接池会触发release事件。触发时间在所有连接都释放后。触发后，刚释放的连接会被看作是可用连接。
        this.pool.on('release', function(connection) {
            // console.log('Connection %d released', connection.threadId);
        });
    }
     /**
     *  查询列表数据
     * @param {String} title 表名，value 参数对象
     * @param {String} search_name 标题查询条件
     * @param {String} search_id ID 查询条件
     * @param {String} search_time_star 开始时间
     * @param {String} search_time_end 结束时间
     * @param {String} search_id ID 查询条件
     * @param {Number} page 第几页
     * @param {Number} limit 每页多少条
     * @return 截取后的数据，文件总数 
    */
    async query(d,arr){
        return new Promise((res,rej)=>{
            this.pool.query(d,arr,(err,results)=>{
                if (err) throw err;
                res(results)
            })
        })
    }
    /**
     *  添加数据
     * @param {Object} title 表名，value 参数对象
     * {title：'表明',value:{title:'文章标题',...}}
     * @return 截取后的数据，文件总数 
     * 
    */
    async add(d){
        return new Promise((res,rej)=>{
            this.pool.query(`INSERT INTO ${d.title} SET ?`, d.value, (err, results) => {
                if (err) throw err;
                res(results)
            })

            // setTimeout(() => {
            //     res(d)
            // }, 1000)
        })
    }
}
module.exports = Pool

